home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / revistas / amigadreams / adreams07-2.dms / adreams07-2.adf / 039 < prev    next >
Text File  |  1995-06-30  |  6KB  |  132 lines

  1. P?
  2.            Leyendo ficheros en ensamblador usando
  3.            Open, Close y Read de Dos.Library.
  4.  
  5. P:           By The Lawnmover Man
  6.  
  7.  
  8.  
  9. P8         Hola  a  todos y bienvenidos a mi artículo.  Seguramente muchos de
  10.      vosotros esteis empezando a dar los primeros pasos  en  ensamblador  y
  11.      más  de  uno se habrá tirado de los pelos al ver lo coñazo que son las
  12.      rutinas para cargar desde disco usando la Dos.Library que aparecen  en
  13.      muchos libros de ensamblador.  Pues bien,  lo que aquí os pongo es una
  14.      rutina más o menos sencilla que cargará vuestros datos  en  un  buffer
  15.      que puede ser creado usando BLK/DCB o asignando vuestra propia memoria
  16.      con la instrucción AllocMem de la Exec.library.  Eso ya  dependerá  de
  17.      vosotros.  El  ejemplo  está  preparado para cargar un fichero de 1024
  18.      bytes (1KB) en la etiqueta DATA, que es precisamente donde se cargarán
  19.      los datos.
  20.  
  21.          Aquí  os pongo la rutina y posteriormente comentaré como funciona.
  22.      Se pueden optimizar muchas cosas y  cada  uno  puede  cambiarla  a  su
  23.      gusto.
  24.  
  25.  
  26. P<
  27.      **************************************************
  28.      * Rutina usando Open,Read y Close de Dos.Library *
  29.      *                                                *
  30.      * By The Lawnmover Man/Suicidal Tendencies       *
  31.      **************************************************
  32.  
  33.      ExecBase = 4
  34.      OpenLib  = -408
  35.      CloseLib = -414
  36.      Open     = -30
  37.      Close    = -36
  38.      Mode_old = 1005
  39.      Read     = -42
  40.  
  41.      Init:
  42.              move.l  ExecBase,a6         ; Base Exec en a6
  43.              lea     Dosname,a1          ; Nombre de Dos.Lib en a1
  44.              moveq   #0,d0               ; Version
  45.              jsr     OpenLib(a6)         ; Abrimos libreria
  46.              move.l  d0,dosbase          ; Salvamos puntero
  47.              move.l  #mode_old,d2        ; Modo fichero OLD
  48.              bsr     openfile            ; Abrimos el fichero
  49.              move.l  #DATA,d2            ; Direccion donde se cargaran
  50.                                          ; los datos
  51.              bsr     readdata            ; Leemos los datos
  52.              bsr     closefile           ; y cerramos el fichero
  53.              move.l  ExecBase,a6
  54.              move.l  dosbase,a1          ; Base Dos.Library en a1
  55.              jsr     CloseLib(a6)        ; Cerramos Dos.Library
  56.              rts                         ; FINISH HIM!!
  57.  
  58.      OpenFile:
  59.              move.l  dosbase,a6          ; Base Dos.Lib en a6
  60.              move.l  #nombre_fichero,d1  ; Nombre del fichero en d1
  61.              jsr     Open(a6)            ; Abrimos fichero
  62.              move.l  d0,filehd           ; Datos del fichero en filehd
  63.              rts
  64.  
  65.      ReadData:
  66.              move.l  dosbase,a6          ; Base Dos.Lib en a6
  67.              move.l  filehd,d1           ; Estructura de fichero en d1
  68.              move.l  #$ffffc,d3          ; Leemos el fichero completo
  69.              jsr     Read(a6)
  70.              rts
  71.  
  72.      CloseFile:
  73.              move.l  dosbase,a6
  74.              move.l  filehd,d1           ; Estructura del fichero en d1
  75.              jsr     Close(a6)           ; Cerramos el fichero
  76.              rts
  77.  
  78.      dosname:    dc.b    "dos.library",0,0
  79.                  even
  80.  
  81.      dosbase:    dc.l    0
  82.      DATA:       dcb.b   1024
  83.      filehd:     dc.l    0
  84.      nombre_fichero: dc.b    "nombrefichero",0
  85.  
  86.               END
  87.  
  88.  
  89.  
  90. P8         Y bien,  vamos a comentar un poco qué es exactamente lo que hace y
  91.      cómo funciona la rutina.
  92.  
  93.          En primer lugar abrimos la Dos.Libray y activamos el MODO_OLD.¿por
  94.      qué?  Porque el modo viejo (mode_old)  es  el  que  nos  permite  leer
  95.      ficheros que ya han sido creados y esto se hace poniendo un 1005 en el
  96.      registro d2 justo antes de llamar a Open.  Si en vez de  haber  puesto
  97.      1005  hubiéramos puesto 1006 el fichero a abrir sería un fichero nuevo
  98.      que deseáramos crear en ese momento.  Tras decirle  al  ordenador  que
  99.      queremos  abrir  un  fichero antiguo llamamos a la subrutina OpenFile.
  100.      Esta subrutina básicamente lo que  hace  es  abrir  el  fichero.  Como
  101.      siempre la base de la librería DOS irá en A6. El nombre del fichero lo
  102.      posicionaremos en  D1  después  de  haberlo  declarado  al  final  del
  103.      programa y tras llamar a Open el ordenador retornará la estructura del
  104.      fichero en d0,  el cual lo salvaremos  en  FILEHD  para  poder  leerlo
  105.      posteriormente.  Ahora  que  ya  tenemos  abiero el fichero es hora de
  106.      leerlo.  Antes de leerlo le decimos al  ordenador  en  dónde  queremos
  107.      leerlo.   En este caso es en la etiqueta DATA que podrá almacenar como
  108.      máximo un fichero de 1024 bytes.  Este valor, por supuesto,  podrá ser
  109.      cambiado para poder leer ficheros de mayor tamaño.  Tras poner data en
  110.      D2 saltamos a la subrutina de lectura.  En esta subrutina  ponemos  la
  111.      estructura  que  hemos  obtenido  al abrir el fichero en d1 y en d3 se
  112.      supone que debe ir la longitud de nuestro  fichero  a  leer,  pero  si
  113.      ponemos $ffffc como longitud lo leerá completo (a menos que el fichero
  114.      tenga más de 20 Mb de longitud, cosa rara). Después de dar los valores
  115.      llamamos  a la función de Read y ya podremos observar cómo se enciende
  116.      el led de la unidad y comienza a leerse el fichero. Ahora sólo faltará
  117.      cerrarlo,  porque  en  ensamblador  todo lo que se abre es necesesario
  118.      cerrarlo.  Primeramente la base de la DOS en a6,  luego la  estructura
  119.      del fichero (filehd) en d1 y tras eso llamamos a Close. ¿facil no?
  120.      Para acabar la rutina cerramos la dos.library usando el CloseLib de la
  121.      Exec y finalizamos con un RTS.
  122.  
  123.          Otra cosa que hay que recalcar es tener  cuidado  si  utilizais el
  124.      INTENA o el DMACON, de poner los valores apropiados  y  desactivar los
  125.      interrupts porque si no el guru que os va a salir va a ser tremendo.
  126.  
  127.          Espero  que  esta  explicación  le  haya  servido a cualquiera que
  128.      tuviera dudas.  Como  ya  dije  al  principio  esta  rutina  se  puede
  129.      optimizar  y  hacer cambios a gusto del programador.  De todas formas,
  130.      esta es a grandes rasgos la que yo siempre utilizo y que  va  incluída
  131.      en mi music-disk "Spanish Feeling".
  132.